#pragma once 
#include <iostream>
#include <string>
using namespace std;

string opers="+-*/%";

enum{
  DivZero=1,
  ModZero,
  Unknown
};

class Task
{
public:
  Task()
  {}
  
  Task(int a,int b, char op):data1_(0),data2_(0),oper_(op),result_(0),exitcode_(0)
  {}

  void run()
  {
    switch(oper_)
    {
      case '+':
        result_ = data1_ + data2_;
        break;
      case '-':
        result_ = data1_ - data2_;
        break;
      case '*':
        result_ = data1_ * data2_;
        break;
      case '/':
        {
          if(data2_ == 0) exitcode_ = DivZero;
          else result_ = data1_ / data2_;
        }
          break;
      case '%':
        {
          if(data2_ == 0) exitcode_ = ModZero;
          else result_ = data1_ % data2_;
        }
          break;
      default:
        exitcode_ = Unknown;
        break;
    }
  }

  void operator()()
  {
    run();
  }

  string GetResult()
  {
    string r = to_string(data1_);
    r+=oper_;
    r+= to_string(data2_);
    r+="=";
    r+=to_string(result_);
    r+="[code: ";
    r+=to_string(exitcode_);
    r+="]";
    return r;
  }

  string GetTask()
  {
    string r = to_string(data1_);
    r+=oper_;
    r+=to_string(data2_);
    r+="=?";
    return r;
  }

private:
  int data1_;
  int data2_;
  char oper_;
  int result_;
  int exitcode_;
  string str="";
};
